package com.wyd.utils;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;


/**
 * all method:
 * 1.  adjustInto  调整指定的Temporal和当前LocalDateTime对
 * 2.  atOffset    结合LocalDateTime和ZoneOffset创建一个
 * 3.  atZone  结合LocalDateTime和指定时区创建一个ZonedD
 * 4.  compareTo   比较两个LocalDateTime
 * 5.  format  格式化LocalDateTime生成一个字符串
 * 6.  from    转换TemporalAccessor为LocalDateTi
 * 7.  get 得到LocalDateTime的指定字段的值
 * 8.  getDayOfMonth   得到LocalDateTime是月的第几天
 * 9.  getDayOfWeek    得到LocalDateTime是星期几
 * 10. getDayOfYear    得到LocalDateTime是年的第几天
 * 11. getHour 得到LocalDateTime的小时
 * 12. getLong 得到LocalDateTime指定字段的值
 * 13. getMinute   得到LocalDateTime的分钟
 * 14. getMonth    得到LocalDateTime的月份
 * 15. getMonthValue   得到LocalDateTime的月份，从1到12
 * 16. getNano 得到LocalDateTime的纳秒数
 * 17. getSecond   得到LocalDateTime的秒数
 * 18. getYear 得到LocalDateTime的年份
 * 19. isAfter 判断LocalDateTime是否在指定LocalDateT
 * 20. isBefore    判断LocalDateTime是否在指定LocalDateT
 * 21. isEqual 判断两个LocalDateTime是否相等
 * 22. isSupported 判断LocalDateTime是否支持指定时间字段或单元
 * 23. minus   返回LocalDateTime减去指定数量的时间得到的值
 * 24. minusDays   返回LocalDateTime减去指定天数得到的值
 * 25. minusHours  返回LocalDateTime减去指定小时数得到的值
 * 26. minusMinutes    返回LocalDateTime减去指定分钟数得到的值
 * 27. minusMonths 返回LocalDateTime减去指定月数得到的值
 * 28. minusNanos  返回LocalDateTime减去指定纳秒数得到的值
 * 29. minusSeconds    返回LocalDateTime减去指定秒数得到的值
 * 30. minusWeeks  返回LocalDateTime减去指定星期数得到的值
 * 31. minusYears  返回LocalDateTime减去指定年数得到的值
 * 32. now 返回指定时钟的当前LocalDateTime
 * 33. of  根据年、月、日、时、分、秒、纳秒等创建LocalDateTi
 * 34. ofEpochSecond   根据秒数(从1970-01-0100:00:00开始)创建L
 * 35. ofInstant   根据Instant和ZoneId创建LocalDateTim
 * 36. parse   解析字符串得到LocalDateTime
 * 37. plus    返回LocalDateTime加上指定数量的时间得到的值
 * 38. plusDays    返回LocalDateTime加上指定天数得到的值
 * 39. plusHours   返回LocalDateTime加上指定小时数得到的值
 * 40. plusMinutes 返回LocalDateTime加上指定分钟数得到的值
 * 41. plusMonths  返回LocalDateTime加上指定月数得到的值
 * 42. plusNanos   返回LocalDateTime加上指定纳秒数得到的值
 * 43. plusSeconds 返回LocalDateTime加上指定秒数得到的值
 * 44. plusWeeks   返回LocalDateTime加上指定星期数得到的值
 * 45. plusYears   返回LocalDateTime加上指定年数得到的值
 * 46. query   查询LocalDateTime
 * 47. range   返回指定时间字段的范围
 * 48. toLocalDate 返回LocalDateTime的LocalDate部分
 * 49. toLocalTime 返回LocalDateTime的LocalTime部分
 * 50. toString    返回LocalDateTime的字符串表示
 * 51. truncatedTo 返回LocalDateTime截取到指定时间单位的拷贝
 * 52. until   计算LocalDateTime和另一个LocalDateTime
 * 53. with    返回LocalDateTime指定字段更改为新值后的拷贝
 * 54. withDayOfMonth  返回LocalDateTime月的第几天更改为新值后的拷贝
 * 55. withDayOfYear   返回LocalDateTime年的第几天更改为新值后的拷贝
 * 56. withHour    返回LocalDateTime的小时数更改为新值后的拷贝
 * 57. withMinute  返回LocalDateTime的分钟数更改为新值后的拷贝
 * 58. withMonth   返回LocalDateTime的月份更改为新值后的拷贝
 * 59. withNano    返回LocalDateTime的纳秒数更改为新值后的拷贝
 * 60. withSecond  返回LocalDateTime的秒数更改为新值后的拷贝
 * 61. withYear    返回LocalDateTime年份更改为新值后的拷贝
 */
public class DateUtils {

    private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>();

    private static final Object object = new Object();

    /**
     * yyyy-MM-dd
     */
    public static String YYYYMMDD = "yyyy-MM-dd";
    /**
     * yyyyMMdd
     */
    public static String YYYYMMDD_STR = "yyyyMMdd";
    /**
     * yyyyMM
     */
    public static String YYYYMM = "yyyyMM";
    /**
     * yyyy-MM-dd HH:mm:ss
     */
    public static String YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss";
    /**
     * yyyy-MM-dd HH:mm:ss SSS
     */
    public static String YYYYMMDDHHMMSSSSS = "yyyy-MM-dd HH:mm:ss SSS";

    /**
     * yyyyMMddHHmmss
     */
    public static String YYYYMMDDHH_STR = "yyyyMMddHH";
    /**
     * yyyyMMddHHmmss
     */
    public static String YYYYMMDDHHMMSS_STR = "yyyyMMddHHmmss";

    /**
     * yyyyMMddHHmmssSSSS
     */
    public static String YYYYMMDDHHMMSSSSSS_STR = "yyyyMMddHHmmssSSSS";
    public static String YYYYMMDDHHMMSSSSS_STR = "yyyyMMddHHmmssSSS";

    public static String YYMMDDHHMMSSSSS_STR = "yyMMddHHmmssSSS";
    public static String YYMMDDHHMMSS_STR = "yyMMddHHmmss";

    public static String YYYYMMDD24HHMMSS_STR = "yyyyMMdd24HHmmss";

    /**
     * yyyyMMdd HH
     */
    public static String YYYYMMDD_HH_STR = "yyyy-MM-dd HH";


    public static final long ONE_SEC_MILLISEC = 1L * 1000L;
    public static final long ONE_MINUTE_MILLISEC = ONE_SEC_MILLISEC * 60L;
    public static final long ONE_HOUR_MILLISEC = ONE_MINUTE_MILLISEC * 60;
    public static final long ONE_DAY_MILLISEC = ONE_HOUR_MILLISEC * 24;


    /**
     * 获取分钟级别时间戳
     */
    public static Long getTimeStampMinute(LocalDateTime date) {
        long l = date.toEpochSecond(ZoneOffset.of("+8"));
        long l1 = l - date.getSecond();//去除秒
        return l1;
    }
    /**
     * 获取秒级别时间戳
     */
    public static Long getTimeStampSecond(LocalDateTime date) {
        return date.toEpochSecond(ZoneOffset.of("+8"));
    }

    /**
     * 获取毫秒级别时间戳
     */
    public static Long getTimeStampMilli(LocalDateTime date) {
        return date.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }


    public static Date convertLDT(LocalDateTime localDateTime) {
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = localDateTime.atZone(zoneId);//Combines this date-time with a time-zone to create a  ZonedDateTime.
        return Date.from(zdt.toInstant());
    }

    public static LocalDateTime convert(Date date) {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDateTime();
    }

    /**
     * 获取当前时间
     *
     * @return LocalDateTime
     */
    public static LocalDateTime nowLdt() {
        return nowByTimestamp(SystemClock.now());
    }

    public static LocalDateTime nowByTimestamp(long timestamp) {
        return Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
//        return LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
    }

    public static LocalDate nowLd() {
        return Instant.ofEpochMilli(SystemClock.now()).atZone(ZoneOffset.ofHours(8)).toLocalDate();
    }

    public static Date nowDate() {
        return new Date(SystemClock.now());
    }

    /**
     * 获取当前时间年月
     */
    public static String getNowMonthString() {
        return formatNow(YYYYMM);
    }

    /**
     * 获取当前时间年月日
     */
    public static String getNowMonthDayString() {
        return formatNow(YYYYMMDD_STR);
    }

    /**
     * 获取当前时间年月日时分秒
     */
    public static String getNowDateString() {
        return formatNow(YYYYMMDDHHMMSS);
    }
    /**
     * 获取当前时间年月日时分秒
     */
    public static String getNowDateHoursString() {
        return formatNow(YYYYMMDDHH_STR);
    }

    /**
     * 获取当前时间戳字符串
     */
    public static String getNowTimeStamp() {
        return formatNow(YYYYMMDDHHMMSSSSSS_STR);
    }

    /**
     * 格式化时间
     */
    public static String format(LocalDateTime localDateTime, String pattern) {
        return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化日期
     *
     * @param localDate
     * @param pattern
     * @return
     */
    public static String format(LocalDate localDate, String pattern) {
        return localDate.format(DateTimeFormatter.ofPattern(pattern));
    }


    public static String format(Date date, String pattern) {
        LocalDateTime convert = convert(date);
        return format(convert, pattern);
    }

    public static LocalDateTime ldtParser(String date, String pattern) {
        return LocalDateTime.parse(date, DateTimeFormatter.ofPattern(pattern));
    }

    public static LocalDate ldParser(String dateStr, String pattern) {
        return LocalDate.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    public static Date dateParser(String date, String pattern) {
        return convertLDT(ldtParser(date, pattern));
    }

    /**
     * 格式化当前时间
     */
    public static String formatNowYMD_HMS() {
        return formatNow(YYYYMMDDHHMMSS);
    }

    /**
     * 格式化当前时间
     */
    public static String formatNow(String pattern) {
        return format(nowLdt(), pattern);
    }

    /**
     * 格式化为日期
     */
    public static LocalDateTime toDateTime(String dateStr, String pattern) {
        if (StringUtils.isEmpty(dateStr) || StringUtils.isEmpty(pattern)) {
            return null;
        }
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 字符串转换为 年月日 时分秒
     */
    public static LocalDateTime toDateTime(String dateStr) {
        return toDateTime(dateStr, YYYYMMDDHHMMSS);
    }

    /**
     * 获取昨天日期
     */
    public static LocalDateTime getYeserday() {
        return nowLdt().minusDays(1);
    }

    public static LocalDateTime getYeserday(LocalDateTime localDateTime) {
        return localDateTime.minusDays(1);
    }

    /**
     * 返回较大的时间
     */
    public static LocalDateTime max(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
        return localDateTime1.compareTo(localDateTime2) > 0 ? localDateTime1 : localDateTime2;
    }

    /**
     * 返回较小的时间
     */
    public static LocalDateTime min(LocalDateTime localDateTime1, LocalDateTime localDateTime2) {
        return localDateTime1.compareTo(localDateTime2) > 0 ? localDateTime2 : localDateTime1;
    }

    /**
     * 获取某天最小的时间点：yyyyMMdd 00:00:00
     */
    public static LocalDateTime getDayStart(LocalDateTime localDateTime) {
        return localDateTime.with(LocalTime.MIN);
//        return toDateTime(format(localDateTime, YYYYMMDD) + " 00:00:00");
    }

    public static LocalDateTime getDayStart(LocalDate localDate) {
        return localDate.atTime(LocalTime.MIN);
    }

    /**
     * 获取某天最后的时间点：yyyyMMdd 23:59:59
     */
    public static LocalDateTime getDayEnd(LocalDateTime localDateTime) {
//        return toDateTime(format(localDateTime, YYYYMMDD) + " 23:59:59");
        return localDateTime.with(LocalTime.MAX);
    }

    public static LocalDateTime getDayEnd(LocalDate localDate) {
        return localDate.atTime(LocalTime.MAX);
    }

    public static long diff(Date endTime, Date startTime) {
        return endTime.getTime() - startTime.getTime();
    }

    /**
     * 获取两个时间的间隔
     *
     * @param source
     * @param target
     * @param unit
     * @return time1-time2
     */
    public static long interval(LocalDateTime source, LocalDateTime target, ChronoUnit unit) {
        return source.until(target, unit);
    }

    public static void sleepNearDayofEnd(long intervalSec) {
        sleepNearDayofEnd(intervalSec, nowLdt());
    }

    /**
     * 判断是否跨天
     * 如果是那么对线程执行休眠跳过这个坎
     * 避免在23:59:59这个节点对业务造成影响，
     * 目前主要应用在流量，短信，语音同步使用
     *
     * @param intervalSec
     * @param currTime
     */
    public static void sleepNearDayofEnd(long intervalSec, LocalDateTime currTime) {
        LocalDateTime dayEnd = getDayEnd(currTime);
        long interval = interval(dayEnd, currTime, ChronoUnit.SECONDS);
        long abs = Math.abs(interval);
        if (interval <= 0 && abs <= intervalSec) {//此处的数字论证要谨慎！！！！不要随意填写
            try {
                System.out.println("interval====" + interval);
                TimeUnit.SECONDS.sleep(abs + 2L);
            } catch (Exception e) {
            }
        }
    }




    /**
     * 字符串日期格式转换
     */
    public static String formatDate(String date, String patternSource, String patternTarget) {
        return format(toDateTime(date, patternSource), patternTarget);
    }

    /**
     * LocalDateTime转Date
     */
    public static Date LocalDateTime2Date(LocalDateTime localDateTime) {
        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }

    /**
     * Date转LocalDateTime
     */
    public static LocalDateTime date2LocalDateTime(Date date) {
        if (date == null) {
            return null;
        }
        Instant instant = date.toInstant();
        return instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * 获取所在周星期一 日期
     */
    public static LocalDate getFirstDayOfWeek(Date time) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");//设置时间格式
        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        int day = cal.get(Calendar.DAY_OF_WEEK);//获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);//根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
        return LocalDate.parse(sdf.format(cal.getTime()), dtf);
    }

    /**
     * 获取日期中的某数值。如获取月份
     *
     * @param date
     *            日期
     * @param dateType
     *            日期格式
     * @return 数值
     */
    private static int getInteger(Date date, int dateType) {
        int num = 0;
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
            num = calendar.get(dateType);
        }
        return num;
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     *
     * @param date
     *            日期字符串
     * @param dateType
     *            类型
     * @param amount
     *            数值
     * @return 计算后日期字符串
     */
    private static String addInteger(String date, int dateType, int amount) {
        String dateString = null;
        DateStyle dateStyle = getDateStyle(date);
        if (dateStyle != null) {
            Date myDate = StringToDate(date, dateStyle);
            myDate = addInteger(myDate, dateType, amount);
            dateString = DateToString(myDate, dateStyle);
        }
        return dateString;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date
     *            日期
     * @param dateStyle
     *            日期风格
     * @return 日期字符串
     */
    public static String DateToString(Date date, DateStyle dateStyle) {
        if(date == null){
            return "";
        }
        String dateString = "";
        if (dateStyle != null) {
            dateString = DateToString(date, dateStyle.getValue());
        }
        return dateString;
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     *
     * @param date
     *            日期
     * @param dateType
     *            类型
     * @param amount
     *            数值
     * @return 计算后日期
     */
    private static Date addInteger(Date date, int dateType, int amount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(dateType, amount);
            myDate = calendar.getTime();
        }
        return myDate;
    }

    /**
     * 获取日期字符串的日期风格。失敗返回null。
     *
     * @param date
     *            日期字符串
     * @return 日期风格
     */
    public static DateStyle getDateStyle(String date) {
        DateStyle dateStyle = null;
        Map<Long, DateStyle> map = new HashMap<Long, DateStyle>();
        List<Long> timestamps = new ArrayList<Long>();
        for (DateStyle style : DateStyle.values()) {
            if (style.isShowOnly()) {
                continue;
            }
            Date dateTmp = null;
            if (date != null) {
                try {
                    ParsePosition pos = new ParsePosition(0);
                    dateTmp = getDateFormat(style.getValue()).parse(date, pos);
                    if (pos.getIndex() != date.length()) {
                        dateTmp = null;
                    }
                } catch (Exception e) {
                }
            }
            if (dateTmp != null) {
                timestamps.add(dateTmp.getTime());
                map.put(dateTmp.getTime(), style);
            }
        }
        Date accurateDate = getAccurateDate(timestamps);
        if (accurateDate != null) {
            dateStyle = map.get(accurateDate.getTime());
        }
        return dateStyle;
    }

    /**
     * 获取精确的日期
     *
     * @param timestamps
     *            时间long集合
     * @return 日期
     */
    private static Date getAccurateDate(List<Long> timestamps) {
        Date date = null;
        long timestamp = 0;
        Map<Long, long[]> map = new HashMap<Long, long[]>();
        List<Long> absoluteValues = new ArrayList<Long>();

        if (timestamps != null && timestamps.size() > 0) {
            if (timestamps.size() > 1) {
                for (int i = 0; i < timestamps.size(); i++) {
                    for (int j = i + 1; j < timestamps.size(); j++) {
                        long absoluteValue = Math.abs(timestamps.get(i) - timestamps.get(j));
                        absoluteValues.add(absoluteValue);
                        long[] timestampTmp = { timestamps.get(i), timestamps.get(j) };
                        map.put(absoluteValue, timestampTmp);
                    }
                }

                // 有可能有相等的情况。如2012-11和2012-11-01。时间戳是相等的。此时minAbsoluteValue为0
                // 因此不能将minAbsoluteValue取默认值0
                long minAbsoluteValue = -1;
                if (!absoluteValues.isEmpty()) {
                    minAbsoluteValue = absoluteValues.get(0);
                    for (int i = 1; i < absoluteValues.size(); i++) {
                        if (minAbsoluteValue > absoluteValues.get(i)) {
                            minAbsoluteValue = absoluteValues.get(i);
                        }
                    }
                }

                if (minAbsoluteValue != -1) {
                    long[] timestampsLastTmp = map.get(minAbsoluteValue);

                    long dateOne = timestampsLastTmp[0];
                    long dateTwo = timestampsLastTmp[1];
                    if (absoluteValues.size() > 1) {
                        timestamp = Math.abs(dateOne) > Math.abs(dateTwo) ? dateOne : dateTwo;
                    }
                }
            } else {
                timestamp = timestamps.get(0);
            }
        }

        if (timestamp != 0) {
            date = new Date(timestamp);
        }
        return date;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     *
     * @param date
     *            日期
     * @param pattern
     *            日期格式
     * @return 日期字符串
     */
    public static String DateToString(Date date, String pattern) {
        String dateString = null;
        if (date != null) {
            try {
                dateString = getDateFormat(pattern).format(date);
            } catch (Exception e) {
            }
        }
        return dateString;
    }

    /**
     * 将日期转化为日期字符串。失败返回null。
     * @param date
     *            日期
     * @param dateFormat
     *            日期格式
     * @return 日期字符串
     */
    public static String DateToString(Date date, SimpleDateFormat dateFormat) {
        String dateString = null;
        if (date != null) {
            try {
                dateString = dateFormat.format(date);
            } catch (Exception e) {
            }
        }

        return dateString;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     *
     * @param date
     *            日期字符串
     * @param pattern
     *            日期格式
     * @return 日期
     */
    public static Date StringToDate(String date, String pattern) {
        Date myDate = null;
        if (date != null) {
            try {
                myDate = getDateFormat(pattern).parse(date);
            } catch (Exception e) {
            }
        }
        return myDate;
    }

    /**
     * 获取SimpleDateFormat
     *
     * @param pattern
     *            日期格式
     * @return SimpleDateFormat对象
     * @throws RuntimeException
     *             异常：非法日期格式
     */
    private static SimpleDateFormat getDateFormat(String pattern) throws RuntimeException {
        SimpleDateFormat dateFormat = threadLocal.get();
        if (dateFormat == null) {
            synchronized (object) {
                if (dateFormat == null) {
                    dateFormat = new SimpleDateFormat(pattern);
                    dateFormat.setLenient(false);
                    threadLocal.set(dateFormat);
                }
            }
        }
        dateFormat.applyPattern(pattern);
        return dateFormat;
    }

    /**
     * 将日期字符串转化为日期。失败返回null。
     *
     * @param date
     *            日期字符串
     * @param dateStyle
     *            日期风格
     * @return 日期
     */
    public static Date StringToDate(String date, DateStyle dateStyle) {
        Date myDate = null;
        if (dateStyle != null) {
            myDate = StringToDate(date, dateStyle.getValue());
        }
        return myDate;
    }

    /**
     * 获取插入数据库格式的时间
     *
     * @return
     */
    public static String getSQLDate() {
        String systemdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    public static String getNumDate() {
        String systemdate = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    /**
     * 获取插入数据库格式的时间yyyy-MM-dd
     *
     * @return
     */
    public static String getSQLDateYMD() {
        String systemdate = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    /**
     * 获取当天日期
     *
     * @return
     */
    public static String getNowDateYMD() {
        String systemdate = new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    /***
     * 日期减一天、加一天
     */
    public static String dateOperation(String option, String _date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cl = Calendar.getInstance();
        Date date = null;

        try {
            date = (Date) sdf.parse(_date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        cl.setTime(date);
        if ("-".equals(option)) {
            // 时间减一天
            cl.add(Calendar.DAY_OF_MONTH, -1);
        } else if ("+".equals(option)) {
            // 时间加一天
            cl.add(Calendar.DAY_OF_YEAR, 1);
        } else {
            // do nothing
        }
        date = cl.getTime();
        return sdf.format(date);
    }

    /**
     * 获取当天日期
     *
     * @return
     */
    public static String getNowDate() {
        String systemdate = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    /**
     * 获取当天分钟
     *
     * @return
     */
    public static String getNowDateMinute() {
        String systemdate = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    /**
     * 获取当天日期dd/MM/yyyy
     * @return
     */
    public static String getDMY() {
        String systemdate = new SimpleDateFormat("dd/MM/yyyy").format(Calendar.getInstance().getTime()); // 获取系统当前时间
        return systemdate;
    }

    /**
     * 获取去年日期dd/MM/yyyy
     * @return
     */
    public static String getLastDMY() {
        Date time = Calendar.getInstance().getTime();
        time.setYear(time.getYear()-1);
        String systemdate = new SimpleDateFormat("dd/MM/yyyy").format(time); // 获取系统当前时间
        return systemdate;
    }

    /**
     * 产生3位随机数
     */
    public static String getThreeRandom() {
        int random1 = (int) (Math.random() * 900 + 100);
        String random = String.valueOf(random1);
        return random;
    }

    /**
     * 产生6位随机数
     */
    public static String getSixRandom() {
        int random1 = (int) (Math.random() * 900000 + 100000);
        String random = String.valueOf(random1);
        return random;
    }

    /**
     * 获取最近24小时按照4个小时进行分组，返回日期list
     */
    public static List<String> getLast24HourByFour() {
        List<String> list = new ArrayList<>();
        LocalDateTime yeserdayLocal = getYeserday();
        String dateStr = yeserdayLocal.format(DateTimeFormatter.ofPattern(YYYYMMDD_HH_STR));

        String day = dateStr.split(" ")[0];
        int hour = yeserdayLocal.getHour();
        String hourStr = "";
        if(hour>= 0 && hour < 4){
            hourStr = "0";
        }else if(hour>= 4 && hour < 8){
            hourStr = "4";
        }else if(hour>= 8 && hour < 12){
            hourStr = "8";
        }else if(hour>= 12 && hour < 16){
            hourStr = "12";
        }else if(hour>= 16 && hour < 20){
            hourStr = "16";
        }else if(hour>= 20 && hour <= 23){
            hourStr = "20";
        }

        String firstDate = day +" " + hourStr + ":00:00";
        list.add(addInteger(firstDate,Calendar.HOUR_OF_DAY,4).substring(0,13));
        list.add(addInteger(firstDate,Calendar.HOUR_OF_DAY,8).substring(0,13));
        list.add(addInteger(firstDate,Calendar.HOUR_OF_DAY,12).substring(0,13));
        list.add(addInteger(firstDate,Calendar.HOUR_OF_DAY,16).substring(0,13));
        list.add(addInteger(firstDate,Calendar.HOUR_OF_DAY,20).substring(0,13));
        list.add(addInteger(firstDate,Calendar.HOUR_OF_DAY,24).substring(0,13));

        return list;
    }


    public static void main(String[] args) {

        System.out.println(getLast24HourByFour());

//        LocalDateTime localDateTime = nowLdt();
//        System.out.println(getTimeStampMilli(localDateTime));
//        System.out.println(getTimeStampSecond(localDateTime));


//        System.out.println(JSON.toJSONString(nowLd()));
//        System.out.println(format(nowLdt(),"yyyy-MM-dd HH:mm:ss:SSS"));

//        sleepNearDayofEnd(5, nowLdt());
//        LocalDateTime now = now();
//        System.out.println(format(now, "yyyy-MM-dd HH:mm:ss") + "=====>" + now.toInstant(ZoneOffset.of("+8")).toEpochMilli());
//
//        LocalDateTime dayEnd = getDayEnd(now);
//        System.out.println(format(dayEnd, "yyyy-MM-dd HH:mm:ss") + "=====>" + dayEnd.toInstant(ZoneOffset.of("+8")).toEpochMilli());
//
//        Date date = new Date(getDayEndMillsSec(now));
//        System.out.println(format(date, "yyyy-MM-dd HH:mm:ss") + "=====>" + date.getTime());
//        LocalDateTime localDateTime2EndofMonth = getLocalDateTime2EndofMonth(now());
//        System.out.println(format(localDateTime2EndofMonth, "yyyy-MM-dd HH:mm:ss") + "=====>" + getTimeStampSecond(localDateTime2EndofMonth));
//        LocalDateTime dayEnd = getDayEnd(localDateTime2EndofMonth);
//        System.out.println(format(dayEnd, "yyyy-MM-dd HH:mm:ss") + "=====>" + getTimeStampSecond(dayEnd));
//        System.out.println(dayEnd.until(ldtParser("2020-06-30 23:59:50", YYYYMMDDHHMMSS), ChronoUnit.SECONDS));
    }

//    public static LocalDateTime getLocalDateTime2EndofMonth(LocalDateTime localDateTime) {
//        String yyyy = format(localDateTime, "yyyy");
//        String MM = format(localDateTime, "MM");
//        int i = daysCount(Integer.parseInt(yyyy), Integer.parseInt(MM));
//        StringBuilder builder = new StringBuilder();
//        builder.append(yyyy);
//        builder.append("-");
//        builder.append(MM);
//        builder.append("-");
//        builder.append(i);
//        builder.append(" 23:59:59");
//        return ldtParser(builder.toString(), YYYYMMDDHHMMSS);
//    }

//    public static int daysCount(int year, int month) {
//        Calendar cal = Calendar.getInstance();
//        cal.set(Calendar.YEAR, year);
//        cal.set(Calendar.MONTH, month);
//        cal.set(Calendar.DATE, 0);
//        return cal.get(Calendar.DATE);
//    }

//    /**
//     * 获取当前时间到本月底的时间
//     *
//     * @return 返回秒
//     */
//    public static long getCurr2EndOfMonthDateSecond() {
//        LocalDateTime now = now();
//        LocalDateTime localDateTime2EndofMonth = getLocalDateTime2EndofMonth(now);
//        return interval(now, localDateTime2EndofMonth, ChronoUnit.SECONDS);
//    }



}
